package praktikum_I.blatt_I.aufgabe1;

import javax.swing.*;
import java.util.ArrayList;
import java.util.List;

public class Mittelwert_Varianz implements Mittelwert_Varianz_inter {
	
	private double mittelwert, mittelwert2;

	private double varianz, varianz2;
	private String nameMessreihe;
	private List<Double> messreihe;
    private double sumMittelwert = 0;
    private double sumMesswertQuadrat = 0;
    private double sumQuadrat = 0;


    //////////       ////////
    //     Konstruktoren   //
    /////////       /////////

	public Mittelwert_Varianz(String name){
		nameMessreihe = name;
		mittelwert = 0;
		varianz = 0;
		messreihe = new ArrayList<Double>();
	}


	public Mittelwert_Varianz(){
		nameMessreihe = "defaultName";
		mittelwert = 0;
		varianz = 0;
		messreihe = new ArrayList<Double>();
	}

    /**
     *  zuruecksetzen des Mittelwerts, der Varianz
     *  und das Loeschen aller Elemente die in der
     *  Messreihe enthalten sind
     */

	public void clearMessObj(){
		messreihe.clear();
		mittelwert = 0;
		varianz = 0;
	}

    /**
     * Liefert die Anzahl der Elemente
     * die sich in der Messreihe befinden
     * @return Integer
     */

	public int lengthMessreihe(){
		return messreihe.size();
	}

    /**
     * gibt den Mittelwert ohne Neuberechnung zurueck
     * @return double
     */

	public double getMittelwert(){
		return mittelwert;
	}

    /**
     * Gibt die Varianz ohne Neuberechnung zurueck
     * @return double
     */

	public double getVarianz(){
		return varianz;
	}

    /**
     * Gibt die Messreihe zurueck
     * @return double
     */

    public List<Double> getMessreihe(){
        return messreihe;
    }


    /**
     * Fuegt den Messwert zur Messreihe hinzu
     * @param messwert
     */

	public void addMesswert(double messwert){
        sumMittelwert += messwert;
        messreihe.add(messwert);
        sumMesswertQuadrat += Math.pow(messwert,2);
        sumQuadrat = Math.pow(sumMittelwert,2);
	}

    /**
     * Addiert eine Liste von Messwerten zu den schon vorhandenen
     * Messwerten hinzu
     * @param messwerte
     */

	public void addMesswerte(List<Double> messwerte){
		for (double elem : messwerte){
            addMesswert(elem);
		}
	}


    /**
     * Errechnen des Mittelwerts, die Methode iteriert
     * dabei über alle Elemente, die in der Messreihe
     * gespeichert sind
     * @return double
     */

	public double calculateMittelwert(){
		double temp1 = 0;
		for (double elem : messreihe){
			temp1 += elem;
		}
		mittelwert = temp1/lengthMessreihe();
        return mittelwert;
	}

    /**
     * Errechnen des Mittelwerts, ohne dabei durch
     * die gesamte Messwertreihe zu iterieren
     * @return double
     */
    public double calculateMittelwert2(){
       return mittelwert2 = sumMittelwert / lengthMessreihe();
    }

    /**
     * Errechnen der Varianz, die Methode iteriert
     * dabei über alle Elemente, die in der Messreihe
     * gespeichert sind
     * @return double
     */

	public double calculateVarianz(){
        varianz= 0.0;
		for (int i=0; i < messreihe.size(); i++){
		    varianz += Math.pow((messreihe.get(i)- calculateMittelwert2()),2);
		}
        varianz = varianz / (lengthMessreihe()-1);
        return varianz;
	}

    /**
     * Errechnen der Varianz, ohne dabei durch
     * die gesamte Messwertreihe zu iterieren
     * @return double
     */

    public double calculateVarianz2(){
      return varianz2 = (sumMesswertQuadrat - (sumQuadrat / lengthMessreihe()))/(lengthMessreihe()-1);
    }

    /**
     * Strinrepaesentation der Messreihe
     * @return Stringrepreasentation auf der Konsole
     */

    @Override
    public String toString(){
        String tmo = "[ ";
        for(Double elem: messreihe){
            tmo += elem + ", ";
        }
        tmo+= " ]";
        return tmo;
    }

}
